package xio.leetcode.java;


import xio.leetcode.java.base.TreeNode;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Stack;

/**
 * 145. Binary Tree Postorder Traversal (Medium)
 * 给定一个二叉树，返回它的 后序 遍历。
 *
 * 示例:
 *
 * 输入: [1,null,2,3]
 *    1
 *     \
 *      2
 *     /
 *    3
 *
 * 输出: [3,2,1]
 * 进阶: 递归算法很简单，你可以通过迭代算法完成吗？
 */
public class LC145_PostorderTraversal {

    List<Integer> result= new ArrayList<>();

    /**
     * 递归解法
     * 递归的解法很简单，与144题的前序遍历相比，区别在于要先执行访问左右节点的递归方法，最后记录节点的值。
     */
    public List<Integer> postorderTraversal(TreeNode root) {
        dfs(root);
        return result;
    }

    private void dfs(TreeNode node) {
        if (node == null) {
            return;
        }
        
        dfs(node.left);
        dfs(node.right);
        result.add(node.val);
    }

    /**
     * 迭代解法
     * 思路：使用栈来存储遍历的节点，结合栈FILO的特点，我们遍历完后得到的结果肯定是 root 节点的值在第一个，
     * 但是要求是后序遍历，仔细对比发现就是把按先走右节点的方式前序遍历的结果逆序排列即可。
     */
    public List<Integer> postorderTraversal2(TreeNode root) {
        Stack<TreeNode> stack = new Stack<>();
        stack.push(root);
        while (!stack.empty()){
            TreeNode node = stack.pop();
            if (node == null){
                continue;
            }
            result.add(node.val);
            stack.push(node.left);
            stack.push(node.right);
        }
        Collections.reverse(result);
        return result;
    }

}
